<?php
/**
 * Classe Db
 * 
 * Classe encarregada de gestionar les conexions amb la base de dades 
 * 
 * @version 1.2 -- 201203091755
 * @author jferrert@copernic.cat  09/03/2012
 * @copyright Creative commons (by-nc-nd) Reconeixement - NoComercial - CompartirIgual 
 */
require_once 'Conf.class.php' ;

class Db{

   private $servidor;
   private $usuari;
   private $password;
   private $base_datos;
   private $tipo;
   private $link;
   
   private static $_instance;

   /*La funció construct es privada per evitar que l'objecte pugui ser creat amb new*/
   private function __construct(){
      $this->setConexio();
      $this->conectar();
   }

   /*Métode para establir els parámetres de la connexió */
   private function setConexio(){
      $conf = Conf::getInstance();
      $this->servidor   = $conf->getHostDB();
      $this->base_datos = $conf->getDB();
      $this->usuari     = $conf->getUserDB();
      $this->password   = $conf->getPassDB();
      $this->tipo       = $conf->getDBType();
   }

   /*Evitar el clonatge de l'objecte. Patró Singleton*/
   private function __clone(){ }

   private function __wakeup(){ }

   /**
    * Funció encarregada de crear, si cal, l'objecte.
    * Aquesta es la funció que cal cridar externament
    * per instanciar l'objecte i poder utilizar els seus métodes
    */
   public static function getInstance(){
      if (!(self::$_instance instanceof self)){
         self::$_instance=new self();
      }
         return self::$_instance;
   }

   /**
    * Realitza la conexió a la base de dades.
    */
   private function conectar(){
    switch ($this->tipo){
	case 'mysql':     $this->link = mysql_connect($this->servidor, $this->usuari, $this->password);
	                       mysql_select_db($this->base_datos,$this->link);
	                       @mysql_query("SET NAMES 'utf8'"); 
            break;	
	case 'postgress': $this->link = pg_connect("host=".$this->servidor." dbname=".$this->base_datos." user=".$this->usuari." password=".$this->password);
            break;
      }
   }

   /**
    * Métode para executar una sentencia sql
    */
   public function executar($sql){
       $resultat = 0;
      switch ($this->tipo){
	     case 'mysql':     mysql_query($sql,$this->link);
                           $resultat = mysql_affected_rows();
						   break;
		 case 'postgress': $result = pg_query($this->link,$sql);
                           $resultat = pg_affected_rows($result);
						   break;
		 break;
	  }
      return $resultat;
   }
   /**
    * Métode para executar una sentencia sql amb retorn de resultats
    */
   public function executarQuery($sql){
      switch ($this->tipo){
	     case 'mysql':     $resultat = mysql_query($sql,$this->link);
						   break;
		 case 'postgress': $resultat = pg_query($this->link,$sql);
						   break;
		 break;
	  }
      return $resultat;
   }

   /**
    * Métode per obtenir una fila de resultats de la sentencia sql
    * */
   public function getFila($stmt,$fila=0){
      $resultat = Array();
      switch ($this->tipo){
	     case 'mysql': if ($fila==0){
	                       $resultat=mysql_fetch_assoc($stmt);
	                   }else{
	                       mysql_data_seek($stmt,$fila);
	                       $resultat=mysql_fetch_assoc($stmt);
	                   }
	                   break;
		 case 'postgress': if ($fila==0){
			                  $resultat=pg_fetch_assoc($stmt);
					       }else{
					          $resultat=pg_fetch_assoc($stmt,$fila);
					       }
					       break;
		break;
	  }
      return $resultat;
   }
   
   public function getTaules(){
	   $resultat = Array();
       switch ($this->tipo){
	     case 'mysql':     	$result = mysql_list_tables($this->base_datos,$this->link); 
							while ($linea = mysql_fetch_row($result)){
								$resultat[] = $linea[0];
							}
							break;
		 case 'postgress':  break;
	  }
      return $resultat;
  }


   /*Métode per obtenir una llista de resultats de la sentencia sql*/
   public function getLlista($stmt){
      $resultat = Array();
      switch ($this->tipo){
	     case 'mysql': while($fila = mysql_fetch_assoc($stmt))
                            $resultat[] = $fila;
	                   break;
		 case 'postgress': while($fila = pg_fetch_assoc($stmt))
                                $resultat[] = $fila;
                           break;
		break;
	  }
      return $resultat;
   }
}
?>
